<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>

  <body>
    <script>
      // 形参 不定长参数/合并运算符
      function sum(...args) {
        console.log(args); //[1,2,3,4,5]
        let sum = 0;
        for (var i = 0; i < args.length; i++) {
          sum += args[i];
        }
        return sum;
      }
      console.log(sum(1, 2, 3, 4, 5));

      // 将复杂对象（数组，对象）按字面量展开 一变多 打散
      // function sum(...args) {
      //   console.log(args);
      //   let sum = 0;
      //   for (var i = 0; i < args.length; i++) {
      //     sum += args[i];
      //   }
      //   return sum;
      // }
      // let arr = [1, 2, 3, 4, 5];

      // // 下面两种写法完全等效
      // console.log(sum(...arr));//将数组展开为一个一个的元素（相当于展开数组后将所有的元素抄在原地）（展开运算符）
      // console.log(sum(1, 2, 3, 4, 5));

      /* 获取数组最大值 */
      // const arr = [3, 5, 7, 4, 9, 2, 8, 1]
      // // console.log(Math.max(arr));//NaN
      // console.log(Math.max(3, 5, 7, 4, 9, 2, 8, 1));//必须把元素一个一个地扔进去
      // console.log(Math.max(...arr));//必须把元素一个一个地扔进去

      /* 合并数组 */
      // const arr1 = [1, 2, 3, 4, 5]
      // const arr2 = [6, 7, 8]
      // // 传统方式
      // const arr3 = arr1.concat(arr2)
      // console.log(arr3);

      // 展开运算符
      // const arr1 = [1, 2, 3, 4, 5]
      // const arr2 = [6, 7, 8]
      // // [1, 2, 3, 4, 5,      6, 7, 8]
      // console.log([...arr1,...arr2]);

      /* 展开一个对象 */
      // const obj = {
      //   name: 'Jack',
      //   age: 18,
      //   gender: '男',
      //   foo: 'bar',
      // }

      // const obj2 = {
      //   name: 'Jack',
      //   age: 18,
      //   gender: '男',
      //   foo: 'bar',

      //   date:new Date()
      // }

      // 这种写法只是上面的语法糖
      // const obj2 = {
      //   ...obj,//把ojb的所有Key-value逐一展开
      //   date:new Date()
      // }
      // console.log(obj2);

      /* 将Obj展开到新对象中到底是深拷贝还是浅拷贝 */
      /* 将obj的所有Key-value都传递给ojb2的同名key,value只要是基本数据类型就是值传递，value只要是引用数据类型就是地址传递 */
      const obj1 = {
        name: "Jack",
        age: 18,
        gender: "男",
        foo: "bar",

        // wife的值是对象（对象数组函数皆为地址）
        wife: {
          name: "如花",
        },
      };
      var obj2 = {
        // name: obj1.name,//基本数据类型传递 值传递
        // age: obj1.age,
        // gender: obj1.gender,
        // foo: obj1.foo,
        // wife:obj1.wife//obj1.wife是对象（地址） obj1的老婆的地址给了obj2.wife

        ...obj1,
      };
      // obj2.name = "John"
      // console.log(obj1,obj2);

      obj2.wife.name = "大菊花";
      console.log(obj1, obj2);
    </script>
  </body>
</html>
